C++ এ মাল্টিথ্রেডিং ব্যবহারের মাধ্যমে একাধিক কাজ একযোগে সম্পন্ন করা যায়। থ্রেড তৈরি, ম্যানেজ করা, এবং থ্রেডের সাথে যোগাযোগ করার জন্য <thread>
লাইব্রেরি এবং std::thread
ক্লাস ব্যবহার করা হয়। প্রতিটি থ্রেড আলাদা একটি ফাংশন বা কোডের অংশ সম্পাদন করে।
C++ এ থ্রেড তৈরি করতে std::thread
ক্লাস ব্যবহার করা হয়। থ্রেড তৈরি করার সময় ফাংশন, মেম্বার ফাংশন, বা ল্যাম্বডা ফাংশন প্রদান করা হয়, যা থ্রেডটি সম্পাদন করবে।
#include <iostream>
#include <thread>
using namespace std;
void printMessage() {
cout << "Hello from thread!" << endl;
}
int main() {
thread t(printMessage); // থ্রেড t তৈরি এবং printMessage ফাংশন কল
t.join(); // থ্রেড t শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
t
নামে একটি থ্রেড তৈরি করা হয়েছে, যা printMessage
ফাংশন সম্পাদন করবে।t.join()
দিয়ে থ্রেডটি শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করবে।আউটপুট:
Hello from thread!
Main function ends.
ল্যাম্বডা ফাংশনের মাধ্যমে থ্রেড তৈরি করলে কোড আরও সংক্ষিপ্ত ও সহজ হয়।
#include <iostream>
#include <thread>
using namespace std;
int main() {
thread t([]() {
cout << "Hello from lambda thread!" << endl;
});
t.join(); // থ্রেড t শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
t
তৈরি করা হয়েছে, যা একটি ছোট কাজ সম্পন্ন করছে।join()
এর মাধ্যমে থ্রেড শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করছে।কোনো ক্লাসের মেম্বার ফাংশনকেও থ্রেড হিসেবে ব্যবহার করা যায়।
#include <iostream>
#include <thread>
using namespace std;
class Worker {
public:
void printMessage() {
cout << "Hello from member function!" << endl;
}
};
int main() {
Worker worker;
thread t(&Worker::printMessage, &worker); // মেম্বার ফাংশন দিয়ে থ্রেড তৈরি
t.join(); // থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
Worker
ক্লাসের printMessage
মেম্বার ফাংশন থ্রেড t
এর মাধ্যমে কল করা হয়েছে।&Worker::printMessage
এর মাধ্যমে মেম্বার ফাংশন থ্রেডে পাস করা হয়েছে এবং &worker
এর মাধ্যমে সেই ক্লাসের অবজেক্টটি প্রদান করা হয়েছে।join()
মেথডের মাধ্যমে একটি থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা করা হয়।detach()
মেথড ব্যবহার করে একটি থ্রেড ব্যাকগ্রাউন্ডে চালাতে দেওয়া হয়, এবং মেইন থ্রেড অবাধে চলতে পারে।joinable()
চেক করে যে থ্রেডটি join()
করার জন্য প্রস্তুত কিনা।#include <iostream>
#include <thread>
using namespace std;
void backgroundTask() {
cout << "Background task running..." << endl;
}
int main() {
thread t(backgroundTask);
if (t.joinable()) {
t.detach(); // থ্রেড ব্যাকগ্রাউন্ডে চলে যাবে
}
cout << "Main function ends." << endl;
return 0;
}
বর্ণনা:
t
থ্রেড detach()
মেথড ব্যবহার করে ব্যাকগ্রাউন্ডে চলে গেছে।joinable()
চেক করা হয়েছে যে থ্রেডটি join
করার যোগ্য কিনা।আউটপুট:
Background task running...
Main function ends.
একই প্রোগ্রামে একাধিক থ্রেড তৈরি করে তাদের একযোগে চালানো যায়।
#include <iostream>
#include <thread>
using namespace std;
void task1() {
for (int i = 1; i <= 5; i++) {
cout << "Task 1 - Count: " << i << endl;
}
}
void task2() {
for (int i = 1; i <= 5; i++) {
cout << "Task 2 - Count: " << i << endl;
}
}
int main() {
thread t1(task1); // প্রথম থ্রেড
thread t2(task2); // দ্বিতীয় থ্রেড
t1.join(); // প্রথম থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
t2.join(); // দ্বিতীয় থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা
cout << "Both tasks completed." << endl;
return 0;
}
বর্ণনা:
t1
এবং t2
তৈরি করা হয়েছে, যা task1
এবং task2
ফাংশন চালাবে।t1.join()
এবং t2.join()
দিয়ে উভয় থ্রেড শেষ হওয়া পর্যন্ত মেইন থ্রেড অপেক্ষা করছে।আউটপুট (পরিকল্পিত নয়):
Task 1 - Count: 1
Task 2 - Count: 1
Task 1 - Count: 2
Task 2 - Count: 2
...
Both tasks completed.
mutex
ব্যবহার করা হয়।mutex
ব্যবহারের সময় ডেডলক সমস্যা হতে পারে। তাই সাবধানে lock
এবং unlock
ব্যবহার করতে হবে।join()
বা ব্যাকগ্রাউন্ডে চালানোর জন্য detach()
করা প্রয়োজন।std::thread
ব্যবহার করে থ্রেড তৈরি করা যায়।join()
, detach()
, এবং joinable()
থ্রেড ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।mutex
এবং ডেডলক প্রতিরোধ ব্যবস্থা গ্রহণ করা উচিত।থ্রেড ব্যবহারে কার্যক্ষমতা বৃদ্ধি পায়, তবে এটি ব্যবহারে সতর্ক থাকা উচিত, কারণ থ্রেড পরিচালনার ভুলে প্রোগ্রাম ক্র্যাশ করতে পারে।
common.read_more